package com.starinside.wp.service.chat;

//import com.ruoyi.ai.domain.Template;
//import com.ruoyi.ai.domain.UserBalance;
//import com.ruoyi.ai.domain.UserBalanceRecord;
//import com.ruoyi.ai.domain.po.CreatePO;
//import com.ruoyi.ai.listener.GLMEventSourceListener;
//import com.ruoyi.ai.listener.MockEventSourceListener;
//import com.ruoyi.ai.listener.OpenAIEventSourceListener;
//import com.ruoyi.ai.sales.domain.UserPlatformLicense;
//import com.ruoyi.ai.sales.service.IUserPlatformLicenseService;
//import com.ruoyi.ai.service.IUserBalanceRecordService;
//import com.ruoyi.ai.service.IUserBalanceService;
//import com.ruoyi.ai.service.impl.glmpatcher.PatchedOkHttpTransport;
//import com.ruoyi.common.core.domain.model.LoginUser;
//import com.ruoyi.common.exception.ServiceException;
//import com.ruoyi.common.utils.SecurityUtils;
//import com.ruoyi.common.utils.StringUtils;

import com.starinside.wp.listener.GLMEventSourceListener;
import com.starinside.wp.listener.MockEventSourceListener;
import com.starinside.wp.listener.OpenAIEventSourceListener;
import com.starinside.wp.service.chat.glmpatcher.PatchedOkHttpTransport;
import com.unfbx.chatgpt.entity.chat.Message;
import com.zhipu.oapi.ClientV3;
import com.zhipu.oapi.Constants;
import com.zhipu.oapi.service.v3.ModelApiRequest;
import com.zhipu.oapi.service.v3.ModelApiResponse;
import com.zhipu.oapi.service.v3.ModelConstants;
import com.zhipu.oapi.utils.OkHttps;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * 支付账号配置Service业务层处理
 *
 * @author qiufeng
 * @date 2023-03-17
 */
@Service
@Slf4j
public class GLMQuestionServiceImpl implements IQuestionService {

    //常公子
    private static String API_KEY = "93c9ba8e4401d2e23d60d9265d1ad548";
    private static String API_SECRET = "Id7G15T8fQgm3bZY";

    private static ClientV3 client = null;
    {
        client = new ClientV3
                .Builder(API_KEY, API_SECRET)
                .httpTransport(new PatchedOkHttpTransport(OkHttps.defaultClient))
                .build();
    }

//    @Autowired
//    private IUserPlatformLicenseService licenseService;
//
//    @Autowired
//    private IUserBalanceService userBalanceService;
//
//
//    @Autowired
//    private IUserBalanceRecordService userBalanceRecordService;

    final static BigDecimal number = BigDecimal.valueOf(1);

//    public String toMessageStr(CreatePO po, Template template){
//        String message = "";
//
//
////       * 你是一个擅长创作【小红书】爆款文章专家，请根据以下要求撰写一篇文章：
////       * 文章主题：【台湾乌龙茶】
////       * 创作要点：【标题运用二极管标题法吸引眼球，内容使用惊叹号、表情符号增加活力，运用悬念和刺激引发读者好奇心，融入热点话题】
////       * 使用场景：【爆款标题】
////       * 关键词：【海拔三千米，原产地台湾，百年传承工艺，古法制茶，入口醇香】
////       * 语气：【感性】
////       * 语言：【中文】
////       * 字数要求：约【100】字
//
//        message += "创作要点：" + template.getContent() + "\n";
//
//        if (StringUtils.isNotBlank(po.getBiz())) {
//            message += "关于" + po.getBiz() + "这个行业，";
//        }
//
//        if (StringUtils.isNotBlank(po.getKeywords())) {
//            message += "关键词：" + po.getKeywords() + "\n";
//        }
//
//        if (StringUtils.isNotBlank(po.getContentStyle())) {
//            message += "语气：" + po.getContentStyle() + "\n";
//        }
//
//        if (StringUtils.isNotBlank(po.getType())) {
//            message += "使用场景：" + po.getType() + "\n";
//        }
//
//        if (StringUtils.isNotBlank(po.getTenant())) {
//            message += "评价" + po.getTenant() + "这个商户，";
//        }
//        if (StringUtils.isNotBlank(po.getRankLevel())) {
//            message += "给与" + po.getRankLevel() + "，";
//        }
//        if (StringUtils.isNotBlank(po.getTargetUser())) {
//            message += "针对" + po.getTargetUser() + "的人群，";
//        }
//        if (StringUtils.isNotBlank(po.getContentConstruct())) {
//            message += "使用" + po.getContentConstruct() + "的撰写结构，";
//        }
//
//        if (StringUtils.isNotBlank(po.getActiveType())) {
//            message += "用于" + po.getActiveType() + "的活动类型，";
//        }
//
//        if (StringUtils.isNotBlank(po.getUseto())) {
//            message += "生成的文案主要用途为" + po.getUseto() + "，";
//        }
//
//        if (StringUtils.isNotBlank(po.getRole())) {
//            message += "文案基于" + po.getRole() + "的角色，";
//        }
//
//        if (StringUtils.isNotBlank(po.getScene())) {
//            message += "文案要适用于" + po.getScene() + "的场景，";
//        }
//
//        if (StringUtils.isNotBlank(po.getBlogtype())) {
//            message += "生成" + po.getBlogtype() + "，";
//        }
//
//        if (StringUtils.isNotBlank(po.getSalestype())) {
//            message += "主要针对" + po.getSalestep() + "这个营销类型，";
//        }
//
//        if (StringUtils.isNotBlank(po.getSalestep())) {
//            message += "用来支撑" + po.getSalestep() + "营销节点的业务。";
//        }
//        if (StringUtils.isNotBlank(template.getExample())) {
//            message += "\n参考案例：" + template.getExample();
//        }
//        return message;
//    }
//
//    @Override
//    @Transactional
//    public synchronized String addRecord(String content, String resultContent,String msg,String type) {
//        LoginUser loginUser = SecurityUtils.getLoginUser();
//        UserBalance userBalance = userBalanceService.selectUserBalanceByUserId(loginUser.getUserId());
//
//        if (userBalance.getBalance().compareTo(number) > 0) {
//            userBalance.setBalance(userBalance.getBalance().subtract(number));
//            userBalanceService.updateUserBalance(userBalance);
//        }
//
//        UserBalanceRecord userBalanceRecord = new UserBalanceRecord();
//        userBalanceRecord.setUserId(loginUser.getUserId());
//        userBalanceRecord.setType(0);
//        userBalanceRecord.setCount(number);
//        userBalanceRecord.setBalance(userBalance.getBalance());
//        userBalanceRecord.setTitle(content);
//        userBalanceRecord.setMoney(userBalance.getMoney());
//        userBalanceRecord.setResultContent(resultContent);
//        userBalanceRecord.setRemark(msg);
//        userBalanceRecord.setCreateType(type);
//        userBalanceRecordService.insertUserBalanceRecord(userBalanceRecord);
//
//        return "ok";
//    }
//
//
//    @Override
//    @Transactional
//    public synchronized UserBalanceRecord addRecord(Long userId, String title, String content, String type, String resultContent, Integer createCount) {
//
//        //完成任务
////        TaskRecord param = new TaskRecord();
////        param.setUserId(userId);
////        param.setOnAction(ITaskRecordService.TASK_RECORD_ACTION_CREATE);
////        List<TaskRecord> records = taskRecordService.selectTaskRecordListUserLastCircle(param);
////
////        for (TaskRecord r : records){
////
////            r.setUserId(userId);
////            r.setRemark("创作：" + title);
////
////            taskRecordService.insertTaskRecord(r);
////        }
//
//        //扣减余额
//        UserBalance userBalance = userBalanceService.selectUserBalanceByUserId(userId);
//
//        if (userBalance.getBalance().compareTo(number) > 0) {
//            userBalance.setBalance(userBalance.getBalance().subtract(number));
//            userBalanceService.updateUserBalance(userBalance);
//        }
//
//        UserBalanceRecord userBalanceRecord = new UserBalanceRecord();
//        userBalanceRecord.setUserId(userId);
//        userBalanceRecord.setType(0);
//        userBalanceRecord.setCount(number);
//        userBalanceRecord.setBalance(userBalance.getBalance());
//        userBalanceRecord.setTitle(title);
//        userBalanceRecord.setContent(content);
//        userBalanceRecord.setCreateType(type);
//        userBalanceRecord.setResultContent(resultContent);
//        userBalanceRecord.setCreateCount(createCount);
//        userBalanceRecord.setMoney(userBalance.getMoney());
//
//        userBalanceRecordService.insertUserBalanceRecord(userBalanceRecord);
//
//        return userBalanceRecord;
//    }
//
//    @Override
//    public boolean isBalanceOK(Long userId, Long platformId, int consume) {
//        UserPlatformLicense param = new UserPlatformLicense();
//
//        List<UserPlatformLicense> licenses = licenseService.selectUserPlatformLicenseList(param);
//
//        if (licenses == null || licenses.size() == 0){
//            throw new ServiceException("没有会员信息");
//        }
//
//        UserPlatformLicense license = licenses.get(0);
//
//        Date now = new Date();
//        if (now.compareTo(license.getValidTo()) < 0){
//            return true;
//        }
//
//        if (license.getValidPoints() > consume){
//
//            //消费点
//            license.setValidPoints( license.getValidPoints() - consume);
//            licenseService.updateUserPlatformLicense(license);
//
//            return true;
//        }
//
//        throw new ServiceException("余额不足");
//    }
//
//    @Override
//    public List<Message> getQuestionMessages(String sysContent, String templateName, String content, String language, Integer length, Integer number) {
//        List<Message> messages = new ArrayList<>();
//
//        String firstPrompt = "你是一个擅长创作" + templateName + "爆款文章专家，请根据以下要求撰写一篇文章。\n";
//
//        messages.add(Message.builder().role(Message.Role.SYSTEM).content(firstPrompt).build());
//
//        {
//            String msg = String.format("语言：%s\n", StringUtils.isNotBlank(language) ? language : "中文");
//            sysContent += msg;
//        }
//
//
//        if (StringUtils.isNotBlank(content)) {
//            sysContent += "文章主题：" + content + "\n";
//        }
//
//        if (length != null) {
//            String msg = String.format("字数要求：约%s字\n", length);
//            sysContent += msg;
//        }
//
//        Message message = Message.builder().role(Message.Role.USER).content(sysContent).build();
//        messages.add(message);
//
//        return messages;
//    }

    @Override
    public void sseQuestion(List<Message> messages, OpenAIEventSourceListener listener){
        // 建议直接查看demo包代码，这里更新可能不及时
        ModelApiRequest modelApiRequest = new ModelApiRequest();
        modelApiRequest.setModelId(Constants.ModelChatGLM6B);
        modelApiRequest.setInvokeMethod(Constants.invokeMethodSse);

        // 可自定义sse listener
        MockEventSourceListener mockListener = new MockEventSourceListener(listener);
        mockListener.setIncremental(false);

        modelApiRequest.setSseListener(mockListener);
        modelApiRequest.setIncremental(true);

        // 构建prompt
//        List<ModelApiRequest.Prompt> prompts = messages.stream().map(o->{
//
//            if (Message.Role.USER.getName().equals(o.getName())){
//                return new ModelApiRequest.Prompt(ModelConstants.roleUser, o.getContent());
//            }else if (Message.Role.SYSTEM.getName().equals(o.getName())
//                    || Message.Role.ASSISTANT.getName().equals(o.getName())){
//                return new ModelApiRequest.Prompt(ModelConstants.roleAssistant, o.getContent());
//            }
//
//            return new ModelApiRequest.Prompt(ModelConstants.roleUser, o.getContent());
//        }).collect(Collectors.toList());

        String promptStr = "";

        for (Message m : messages){
            if (Message.Role.USER.getName().equals(m.getRole()) || Message.Role.SYSTEM.getName().equals(m.getRole()) ){
                promptStr += m.getContent();
            }
        }

        log.info("最终提示语：\n{}", promptStr);

        List<ModelApiRequest.Prompt> prompts = new ArrayList<>();
        prompts.add(new ModelApiRequest.Prompt(ModelConstants.roleUser, promptStr));

        modelApiRequest.setPrompt(prompts);

        String requestId = System.currentTimeMillis() + "";
        modelApiRequest.setRequestId(requestId);

        ModelApiResponse response = client.invokeModelApi(modelApiRequest);
    }

    @Override
    public String getSysQuestionString( List<Message> messages ) {
        return "";
    }



    public static void main(String[] args) throws InterruptedException {
        // 建议直接查看demo包代码，这里更新可能不及时
        ModelApiRequest modelApiRequest = new ModelApiRequest();
        modelApiRequest.setModelId(Constants.ModelChatGLM6B);
        modelApiRequest.setInvokeMethod(Constants.invokeMethodSse);

        // 可自定义sse listener
        GLMEventSourceListener listener = new GLMEventSourceListener();
        listener.setIncremental(false);

        modelApiRequest.setSseListener(listener);
        modelApiRequest.setIncremental(true);

        // 构建prompt
        List<Message> messages = new ArrayList<>();
        {
            String firstPrompt = "你扮演一个文案创作专家，帮我创作用于各种情况的的文案内容。" +
                    "某些情况下我会补充更多的信息给你，你根据我提供的不同创作场景和条件，为我撰写相关文案。";

            String msg = String.format("文案总长度严格控制在 %s 个字以内，不能够超出。", 100);
            firstPrompt += msg;

            messages.add(Message.builder().role(Message.Role.SYSTEM).content(firstPrompt).build());


            String sysContent = "主题：小米手机。用可爱的语气，撰写关于好物分享的文案。";
            Message message = Message.builder().role(Message.Role.USER).content(sysContent).build();

            messages.add(message);
        }



        String promptStr = "";

        for (Message m : messages){
            if (Message.Role.USER.getName().equals(m.getRole()) || Message.Role.SYSTEM.getName().equals(m.getRole()) ){
                promptStr += m.getContent() + "。";
            }
        }


        List<ModelApiRequest.Prompt> prompts = new ArrayList<>();
        prompts.add(new ModelApiRequest.Prompt(ModelConstants.roleUser, promptStr));

        modelApiRequest.setPrompt(prompts);

        String requestId = System.currentTimeMillis() + "";
        modelApiRequest.setRequestId(requestId);

        client.invokeModelApi(modelApiRequest);

//        listener.getCountDownLatch().await();
    }
}
